import numpy as np
from io2excel import *

'''
T_out：室外干球温度  T_in：室内干球温度
W_out：室外相对湿度  W_in：室内相对湿度
radiation_solar：太阳辐射
speed_wind：室外风速
rainfall：降雨量
'''

# 从导出的Excel气象文件中读取离散边界条件
def boundary_fromData_weather(direction: str='None'):
    fileName = 'boundary data/WeatherData.xlsx'                 # 自定义数据文件
    sheetName = '逐时气象参数'                                  # 文件中的工作表名称
    table_value = readExcel(fileName, sheetName)                # 读取工作表数据

    t = np.array(table_value[4][3:])      # 第4行第3列之后的数字为 干球温度
    rh = np.array(table_value[5][3:])     # 同上 相对湿度

    v = np.array(table_value[21][3:])     # 同上 风速
    rain = np.zeros(8760)                 # 缺省 降雨

    # 分别取东南西北辐射强度，没有输入则为0
    if direction == 'E':
        i = np.array(table_value[14][3:])
    elif direction == 'S':
        i = np.array(table_value[15][3:])
    elif direction == 'W':
        i = np.array(table_value[16][3:])
    elif direction == 'N':
        i = np.array(table_value[17][3:])
    else:
        i = np.zeros(8760)

    boundary_value = np.array([t, rh, i, v, rain])
    return boundary_value

'''
将给定时间间隔的离散边界条件转化为计算时间步长的边界条件：（整除）
    当输入的边界条件中，给出了5个时间点的温度[21,22,23]时，给定的时间间隔为15s，而计算时间步长为5s时
    转化后的温度应该为：[21,21,21,22,22,22,23,23,23]
'''


# 边界条件离散化处理
def boundary_processing_discrete(boundary_value, time_step, time_interval=3600):
    # 当给定时间间隔为计算时间步长整数倍时，计算倍数大小
    multiple = time_interval / time_step
    # 根据倍数大小，将边界条件进行复制
    boundary_value = np.array(boundary_value).repeat(multiple, axis=1)
    # 返回符合计算条件的离散化边界条件
    return boundary_value


'''
将边界条件的个数与计算时间的个数进行匹配：
    当输入的边界条件中，给出了5个时间点的温度[21,22,23,24,25]，但计算次数为8次，
    即以5为周期，再延续前三个点的温度[21,22,23]，合并为8个时间点[21,22,23,24,25,21,22,23]进行计算
'''


# 边界条件周期化处理
def boundary_processing_cycle(boundary_value, time_count):
    boundary_value = np.array(boundary_value)

    time_count = int(time_count)
    cols = boundary_value.shape[1]  # 取边界条件的列数，同种类型边界的个数

    module, remainder = divmod(time_count, cols)  # 取模取余：module 模；remainder 余数

    part_module = np.tile(boundary_value, module)  # 复制整数部分的矩阵
    if remainder > 0:
        part_remainder = boundary_value[:, :remainder]  # 得到余数部分的连续矩阵
        boundary_value = np.concatenate((part_module, part_remainder), axis=1)  # 将整数与余数部分矩阵进行连接，按第1轴（x轴）
    else:
        boundary_value = part_module

    # 将摄氏温度转化为绝对温度
    boundary_value[0] += 273.15
    # 若相对湿度大于1，小于100，将相对湿度转化为小数
    if True in (boundary_value[1] > 1):
        boundary_value[1] /= 100

    return boundary_value


if __name__ == '__main__':
    boundary_value = boundary_fromData_weather('E')
    print(boundary_value[:,7:12])
